package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.redis.service.IUserInfoRedisService;
import cn.wolfcode.wolf2w.repository.UserInfoRepository;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.AssertUtil;
import cn.wolfcode.wolf2w.util.Consts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.UUID;

/**
 * 目的地业务层的实现类
 */
@Service
public class UserInfoServiceImpl implements IUserInfoService{

    //  注入UserInfoRepository持久层接口
    @Autowired
    private UserInfoRepository userInfoRepository;

    //  注入IUserInfoRedisService业务层接口
    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    //  插入单个方法
    @Override
    public void insert(UserInfo userInfo) {

        //  id自动生成，手动设置为空
        userInfo.setId(null);

        //  调用持久层接口的save方法执行插入单个目的地对象
        userInfoRepository.save(userInfo);
    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个目的地对象
        userInfoRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(UserInfo userInfo) {

        //  调用持久层接口的save方法执行修改单个目的地对象
        userInfoRepository.save(userInfo);
    }

    //  查询单个方法
    @Override
    public UserInfo selectById(String id) {

        //  orElse，若id没有则为null
        //  调用持久层接口的findById方法执行查询单个目的地对象
        return userInfoRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<UserInfo> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有目的地对象
        return userInfoRepository.findAll();
    }

    @Override
    public boolean findByPhone(String phone) {
        //  使用mongodb的jpa验证手机号
        UserInfo userInfo = userInfoRepository.findByPhone(phone);
        //  返回boolean值
        return userInfo != null;
    }

    @Override
    public void sendVerifyCode(String phone, String smsUrl, String smsAppkey) {

        //  随机生成验证码
        String code = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 4);

        //  模拟获取到验证码
        StringBuilder sb = new StringBuilder(80);
        sb.append("您获取的验证码为：")
                .append(code)
                .append("，请在")
                .append(Consts.VERIFY_CODE_VAI_TIME)
                .append("分钟之内完成注册！");

        //  调用设置key和value到redis中的方法
        userInfoRedisService.setVerifyCode(phone, code);

        //  打印验证码
        System.out.println(sb.toString());

        /*
        *
        * Url:https://way.jd.com/chuangxin/dxjk?mobile=13568813957&
        * content=【创信】你的验证码是：5873，3分钟内有效！&
        * appkey=16847083cf807fb247f20c8f79391ab2
        *
        *
        */
        //RestTemplate restTemplate = new RestTemplate();
        //  第一个参数是url
        //  第二个参数是返回值类型
        //  第三个参数是需求参数
        //String restTemplateForObject = restTemplate.getForObject(smsUrl, String.class, phone, "【叩丁狼】" + sb.toString(), smsAppkey);

        //if (!restTemplateForObject.contains("Success")) {
           // throw new LogicException("发送失败");
        //}

        //System.out.println(restTemplateForObject);

    }

    @Override
    public void regist(String phone, String nickname, String password, String rpassword, String verifyCode) {

        //  参数不为空
        AssertUtil.hasLength(phone, "手机号码不能为空");
        AssertUtil.hasLength(nickname, "昵称不能为空");
        AssertUtil.hasLength(password, "密码不能为空");
        AssertUtil.hasLength(rpassword, "验证密码不能为空");
        AssertUtil.hasLength(verifyCode, "验证码不能为空");

        //  两次密码是否一致
        AssertUtil.isEquals(password, rpassword, "两次输入密码不一致");

        //  判断手机是否符合格式  @TODO


        //  判断手机唯一
        if (this.findByPhone(phone)) {
            throw new LogicException("该手机号码已被注册");
        }

        //  判断验证是否唯一
        String code = userInfoRedisService.getVerifyCode(phone);
        if (code == null || !code.equalsIgnoreCase(verifyCode)) {
            throw new LogicException("验证码错误或失效");
        }

        //  注册
        UserInfo userInfo = new UserInfo();
        userInfo.setNickname(nickname);
        userInfo.setPhone(phone);
        userInfo.setEmail("");
        userInfo.setPassword(password);
        userInfo.setGender(UserInfo.GENDER_MALE);
        userInfo.setLevel(1);
        userInfo.setCity("");
        userInfo.setHeadImgUrl("/images/default.jpg");
        userInfo.setInfo("");
        userInfo.setState(UserInfo.STATE_NORMAL);
        userInfoRepository.save(userInfo);
    }

    @Override
    public UserInfo login(String phone, String password) {

        //  判断登录时传入的参数
        AssertUtil.hasLength(phone, "账号不能为空");
        AssertUtil.hasLength(password, "密码不能为空");

        //  查询数据库是否存在该对象，已经验证账号密码是否对应
        UserInfo userInfo = userInfoRepository.findByPhone(phone);
        if (userInfo == null || !userInfo.getPassword().equals(password)) {
            throw new LogicException("账号或密码错误");
        }
        return userInfo;
    }

    @Override
    public List<UserInfo> queryCity(String keyword) {
        return userInfoRepository.findByCity(keyword);
    }
}
